package com.html.blog.model;

import com.jfinal.plugin.activerecord.Model;
import com.jfinal.plugin.activerecord.Page;

/**
 * Blog model.

将表结构放在此，消除记忆负担
mysql> desc blog;
+---------+--------------+------+-----+---------+----------------+
| Field   | Type         | Null | Key | Default | Extra          |
+---------+--------------+------+-----+---------+----------------+
| id      | int(11)      | NO   | PRI | NULL    | auto_increment |
| title   | varchar(200) | NO   |     | NULL    |                |
| content | mediumtext   | NO   |     | NULL    |                |
+---------+--------------+------+-----+---------+----------------+

数据库字段名建议使用驼峰命名规则，便于与 java 代码保持一致，如字段名： userId
 */
@SuppressWarnings("serial")
public class Blog extends Model<Blog> {

	/**
	 * 特别注意：Blog 中定义的 public static final Blog dao 对象是全局共享的，
	 * 只能用于数据库查询，不能用于数据承载对象。数据承载需要使用 new User().set(…)来实现。
	 */
	public static final Blog me = new Blog();
	
	/**
	 * 所有 sql 写在 Model 或 Service 中，不要写在 Controller 中，养成好习惯，有利于大型项目的开发与维护
	 */
	public Page<Blog> paginate(int pageNumber, int pageSize) {
		return paginate(pageNumber, pageSize, "select *", "from blog order by id asc");
	}
	/**
	 * JFinal  独创 Db + Record  模式
	 * Db 类及其配套的 Record 类，提供了在 Model 类之外更为丰富的数据库操作功能。
	 * 使用 Db 与 Record 类时，无需对数据库表进行映射，Record 相当于一个通用的 Model。
	 *
	 * 事务处理示例：
	 * boolean succeed = Db.tx(new IAtom(){
	 *		public boolean run() throws SQLException {
	 *			int count = Db.update("update account set cash = cash - ? where id = ?", 100, 123);
	 *  		int count2 = Db.update("update account set cash = cash + ? where id = ?", 100, 456);
	 * 			return count == 1 && count2 == 1;
	 * 		}
	 * 	});
	 *
	 *
	 * 声明式事务：
	 * @Before(Tx.class)
	 * public void trans_demo() {
	 * 		// 获取转账金额
		   	Integer transAmount = getParaToInt("transAmount");
			// 获取转出账户id
			Integer fromAccountId = getParaToInt("fromAccountId");
			...
	 * }
	 *
	 * 以上代码中，仅声明了一个 Tx 拦截器即为 action 添加了事务支持。除此之外 ActiveRecord
	 * 还配备了TxByRegex、TxByActionKeys、TxByActionMethods，分别支持regex(正则)、actionKeys、
	 * actionMethods 声明式事务，以下是示例代码：
	 * public void configInterceptor(Interceptors me) {
	 * 		// TxByRegex 拦截器可通过传入正则表达式对 action 进行拦截，当 actionKey 被正则匹配上将开启事务。
	 * 		me.add(new TxByRegex(".*save.*"));
	 * 		// TxByActionKeys 可以对指定的 actionKey 进行拦截并开启事务
	 *		me.add(new TxByActionKeys("/cash/trans", "/other"));
	 *		// TxByActionMethods 可以对指定的 method 进行拦截并开启事务
	 *		me.add(new TxByActionMethods("save", "update"));
	 * }
	 *
	 * 注意：MySql 数据库表必须设置为 InnoDB 引擎时才支持事务，MyISAM 并不支持事务。
	 *
	 * Cache
	 * ActiveRecord 可以使用缓存以大大提高性能，以下代码是 Cache 使用示例：
	 * public void list() {
	 *		List<Blog> blogList = Blog.dao.findByCache("cacheName", "key",
	 *		"select * from blog");
	 *		setAttr("blogList", blogList).render("list.html");
	 * }
	 *
	 * 上例 findByCache 方法中的 cacheName 需要在 ehcache.xml 中配置 如：<cache
	 * name="cacheName"  …> 。 此 外 Model.paginateByCache(…) 、 Db.findByCache(…) 、
	 * Db.paginateByCache(…)方法都提供了 cache 支持。在使用时，只需传入 cacheName、key 以及
	 * 在 ehcache.xml 中配置相对应的 cacheName 就可以了。
	 */
}
